package 题组;

/**
 * @author 挚爱之夕
 * @date 2021/9/11 - 09 - 11 - 15:01
 * @Description: 题组
 * @Version: 1.0
 */
public class _007_翻转字符串中的单词 {
    public static void main(String[] args) {
        String s = "I am java developer";
        String s1 = reverseWords(s);
        System.out.println(s1);
    }
    /*
    开辟一个新字符串。
    然后从头到尾遍历原字符串，直到找到空格为止，
    此时找到了一个单词，并能得到单词的起止位置。
    随后，根据单词的起止位置，可以将该单词逆序放到新字符串当中。
    如此循环多次，直到遍历完原字符串，就能得到翻转后的结果。
    时间复杂度：O(N)，其中 N 为字符串的长度。
    原字符串中的每个字符都会在O(1) 的时间内放入新字符串中。
    空间复杂度：O(N)O(N)。我们开辟了与原字符串等大的空间。
     */
    private static String reverseWords(String s) {
        StringBuffer ret = new StringBuffer();
        int length = s.length();
        int i = 0;
        while (i < length) {
            int start = i;
            while (i < length && s.charAt(i) != ' ') {
                i++;
            }
            for (int p = start; p < i; p++) {
                ret.append(s.charAt(start + i - 1 - p));
            }
            while (i < length && s.charAt(i) == ' ') {
                i++;
                ret.append(' ');
            }
        }
        return ret.toString();
    }
    private String reverseWords1(String s) {
        String s1 = reverseString(s);
        String[] words = s1.split("\\s");
        StringBuilder sb = new StringBuilder();
        for(int i = words.length-1;i>=0;i--){
            sb.append(words[i]).append(" ");
        }
        return sb.deleteCharAt(sb.length()-1).toString();
    }
    private static String reverseString(String s){
        int length = s.length();
        char[] charArr = new char[length];
        for(int i =0;i<length;i++){
            charArr[i]=s.charAt(length-1-i);
        }
        return new String(charArr);
    }
}
